package views.mediators
{
	import com.axon.mvc.helpers.AxVerbs;
	import com.axon.mvc.patterns.mediator.AxMediatorPopUp;
	
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.net.FileReference;
	
	import models.vo.Foto;
	import models.vo.Vistoria;
	
	import mx.utils.StringUtil;
	
	import org.restfulx.utils.RxFileReference;
	
	import views.components.FotoPropView;

	public class FotoPropMediator extends AxMediatorPopUp
	{
		private var viewAction	: String	= "";
		private var vistoria	: Vistoria	= null;		
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function FotoPropMediator(parent: DisplayObject, foto: Foto, crudOperation: String, vistoria: Vistoria) 
		{ 
			super(parent, foto);
			
			view.crudOperation 				= crudOperation;
			this.vistoria					= vistoria;
			view.pbSaveAndNew.visible		= (crudOperation == AxVerbs.NEW);
			view.pbSaveAndClose.visible		= (crudOperation == AxVerbs.NEW);
			view.pbSave.visible				= (crudOperation == AxVerbs.EDIT);
			
			view.pbFechar.label 			= ( view.crudOperation == AxVerbs.EDIT) ? 'Cancelar' : 'Fechar';

			view.pbSave.setStyle("left", view.pbSaveAndNew.getStyle("left"));
			
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get view(): FotoPropView { return viewComponent as FotoPropView; }
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////

		override protected function initialize(): void
		{
			regResponseInterest( Foto, [ AxVerbs.CREATE, AxVerbs.UPDATE ] );
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override protected function viewValueObjectOk(): void 
		{
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function eventSelectFile(): void
		{
			view.txtArLegenda.setFocus();	        
	        view.foto = new RxFileReference("image");
	        view.foto.reference.addEventListener( Event.SELECT,			onFotoSselect,		false, 0, true );
	        view.foto.reference.addEventListener( Event.CANCEL,			onFotoCancelBrowse,	false, 0, true );
	        view.foto.reference.addEventListener( IOErrorEvent.IO_ERROR,onFotoIoError,		false, 0, true );
	        view.foto.reference.browse();
		}
		
		private function onFotoSselect(event: Event):void 
	    { 
	        view.fotoNomeArquivo = FileReference(event.target).name;
	    	eventDataChange();
	    }
	      
	    private function onFotoCancelBrowse(event: Event):void 
	    {
	    	view.foto			 = null;
	    	view.fotoNomeArquivo = "";
	    	eventDataChange();
	    }
	      
	    private function onFotoIoError(event: Event):void 
	    {
	    	view.errorString = "Falha na escolha da foto. Por favor, tente novamente.";
		}
	      
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function eventDataChange(): void
		{
			view.pbSave.enabled = ( (view.foto || (view.crudOperation == AxVerbs.EDIT)) && (StringUtil.trim(view.txtArLegenda.text) != '') );
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////

		public function eventSave(viewAction: String): void 
		{ 
			view.txtArLegenda.setFocus();

			this.viewAction = viewAction;

			if ( StringUtil.trim(view.txtArLegenda.text) == "") {
				view.errorString = "A legenda da foto não pode ficar em branco.";
				return; }

			if ( (!view.foto) && (viewAction != AxVerbs.SAVE)) {
				view.errorString = "Informe o arquivo correspondente à foto.";
				return; }

			Foto(view.vo).vistoria	 = vistoria;
			Foto(view.vo).legenda    = view.txtArLegenda.text;

			if (view.foto)
				Foto(view.vo).attachment = view.foto;

			callController(Foto, AxVerbs.SAVE, view.vo); 
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function respFotoCreateSuccess( sender: Object, body: Object, extraInfo: Object ): void
		{
			if ( viewAction == AxVerbs.SAVE_AND_CLOSE ) {
				closePopUp(); }
			else {
				view.vo = new Foto();
				view.txtArquivo.text = "" }
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function respFotoCreateFailure( sender: Object, body: Object, extraInfo: Object ): void
		{
			view.errorString = "Falha na gravação da foto (provavelmente algum problema no servidor)."
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function respFotoUpdateSuccess( sender: Object, body: Object, extraInfo: Object ): void
		{
			closePopUp();
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function respFotoUpdateFailure( sender: Object, body: Object, extraInfo: Object ): void
		{
			view.errorString = "Falha na gravação da foto (provavelmente algum problema no servidor)."
		}

	}
}